package com.sk.sqd;

/**
 * 懒汉式
 */
public class LazySingle {

    private static LazySingle lazySingle = null;

    private LazySingle() {
    }

    /**
     * 同步方法
     * 多线程每次访问都需要验证，可以进行优化
     */
    public static synchronized LazySingle getInstance() {
        if (lazySingle == null) {
            lazySingle = new LazySingle();
        }
        return lazySingle;
    }

    /**
     * 同步代码
     * 多线程同时调用可能出现问题
     */
    public static LazySingle getInstance2() {
        if (lazySingle == null) {
            synchronized (LazySingle.class) {
                lazySingle = new LazySingle();
            }
        }
        return lazySingle;
    }

    /**
     * 双检锁
     * 为了保证可见性，双检锁需要对变量增加 volatile 关键字
     */
    public static LazySingle getInstance3() {
        if (lazySingle == null) {
            synchronized (LazySingle.class) {
                if (lazySingle == null) {
                    lazySingle = new LazySingle();
                }
            }
        }
        return lazySingle;
    }

    /**
     * 静态内部类实现
     */
    private static class SingleBean {
        private final static LazySingle instance = new LazySingle();
    }

    public static LazySingle getInstance4() {
        return SingleBean.instance;
    }

}
